#ifndef GrafoVertice_
#define GrafoVertice_

#include <cstddef> // NULL
template<class TV, class TR>
class Grafo;

template<class TV, class TR>
class GrafoRamo;

template<class TV, class TR> //Classe dos vertices do grafo
class GrafoVertice {
	friend class Grafo<TV, TR> ;

private:
	TV vconteudo;
	int key;
	GrafoVertice<TV, TR>* apvertice;
	GrafoRamo<TV, TR>* apramo;

public:
	GrafoVertice();
	GrafoVertice(const TV& conteudo, int k);
	GrafoVertice(const GrafoVertice<TV, TR>& v);
	~GrafoVertice();

	TV getConteudo() const;
	GrafoVertice<TV, TR>* getVerticeApontado() const;
	GrafoRamo<TV, TR>* getRamoApontado() const;
};

template<class TV, class TR>
GrafoVertice<TV, TR>::GrafoVertice() {
	key = 0;
	apvertice = NULL;
	apramo = NULL;
}

template<class TV, class TR>
GrafoVertice<TV, TR>::GrafoVertice(const TV& conteudo, int k) {
	vconteudo = conteudo;
	key = k;
	apvertice = NULL;
	apramo = NULL;
}

template<class TV, class TR>
GrafoVertice<TV, TR>::GrafoVertice(const GrafoVertice<TV, TR>& v) {
	vconteudo = v.vconteudo;
	key = v.key;
	apvertice = v.apvertice;
	apramo = v.apramo;
}

template<class TV, class TR>
GrafoVertice<TV, TR>::~GrafoVertice() {

}

template<class TV, class TR>
TV GrafoVertice<TV, TR>::getConteudo() const {
	return vconteudo;
}

template<class TV, class TR>
GrafoVertice<TV, TR>* GrafoVertice<TV, TR>::getVerticeApontado() const {
	return apvertice;
}

template<class TV, class TR>
GrafoRamo<TV, TR>* GrafoVertice<TV, TR>::getRamoApontado() const {
	return apramo;
}
#endif

